/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pooproj.repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import pooproj.basica.Midia;
import pooproj.erro.ConexaoException;
import pooproj.erro.ConsultaException;
import pooproj.util.GerenciadorConexao;
import pooproj.util.GerenciadorConexaoImpl;

/**
 *
 * @author Daniella
 */
public class RepositorioMidiaImpl implements RepositorioMidia{
    
    //Obter a instância
    private GerenciadorConexao gc = GerenciadorConexaoImpl.getInstancia();

    @Override
    public void inserir(Midia m) throws ConsultaException, ConexaoException {
        Connection con = gc.conectar();
        String sql = "INSERT INTO midia (tipoMidia, codFilme) VALUES (?,?)";
        try{
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setString(1,m.getTipoMidia());
            pstm.setInt(2,m.getFilme().getCodFilme());
            pstm.executeUpdate();
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        }
    }

    @Override
    public void alterar(Midia m) throws ConsultaException, ConexaoException {
        Connection con = gc.conectar();
        String sql = "UPDATE midia SET tipoMidia=?, codFilme=? WHERE codMidia=?";
        try{
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setString(1,m.getTipoMidia());
            pstm.setInt(2,m.getFilme().getCodFilme());
            pstm.setInt(3,m.getCodMidia());
            pstm.executeUpdate();
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        }
    }

    @Override
    public void excluir(Midia m) throws ConsultaException, ConexaoException {
        Connection con = gc.conectar();
        String sql = "DELETE FROM midia WHERE codMidia=?";
        try{
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setInt(1,m.getCodMidia());
            pstm.executeUpdate();
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        }
    }

    @Override
    public ArrayList<Midia> listar() throws ConsultaException, ConexaoException {
        Connection con = gc.conectar();
        ArrayList<Midia> lista = new ArrayList();
        Midia m;
        String sql = "SELECT midia.codMidia, midia.tipoMidia, midia.codFilme, filme.nomeFilme FROM midia, filme WHERE midia.codFilme=filme.codFilme ORDER BY filme.codFilme";
        try{
            Statement stm = con.createStatement();
            ResultSet rs = stm.executeQuery(sql);
            while(rs.next()){
                m = new Midia();
                m.setCodMidia(rs.getInt("codMidia"));
                m.setTipoMidia(rs.getString("tipoMidia"));
                m.getFilme().setCodFilme(rs.getInt("codFilme"));
                m.getFilme().setNomeFilme(rs.getString("nomeFilme"));
                lista.add(m);
            }
            stm.close();
            rs.close();
            
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        }
        return lista;
    }

    @Override
    public Midia consultar(Integer id) throws ConsultaException, ConexaoException {
        Connection con = gc.conectar();
        String sql = "SELECT midia.codMidia, midia.tipoMidia, midia.codFilme, filme.nomeFilme FROM midia, filme WHERE midia.codFilme=filme.codFilme AND midia.codMidia=?";
        Midia m = null;
        try{
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setInt(1,id);
            ResultSet rs = pstm.executeQuery();
            if(rs.next()){
                m = new Midia();
                m.setCodMidia(rs.getInt("codMidia"));
                m.setTipoMidia(rs.getString("tipoMidia"));
                m.getFilme().setCodFilme(rs.getInt("codFilme"));
                m.getFilme().setNomeFilme(rs.getString("nomeFilme"));
            }
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        }
        return m;
    }

    @Override
    public Midia consultarCodFilme(Integer codFilme) throws ConsultaException, ConexaoException {
        Connection con = gc.conectar();
        String sql = "SELECT midia.codMidia, midia.tipoMidia, midia.codFilme, filme.nomeFilme FROM midia, filme WHERE midia.codFilme=filme.codFilme AND midia.codFilme=?";
        Midia m = null;
        try{
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setInt(1,codFilme);
            ResultSet rs = pstm.executeQuery();
            if(rs.next()){
                m = new Midia();
                m.setCodMidia(rs.getInt("codMidia"));
                m.setTipoMidia(rs.getString("tipoMidia"));
                m.getFilme().setCodFilme(rs.getInt("codFilme"));
                m.getFilme().setNomeFilme(rs.getString("nomeFilme"));
            }
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        }
        return m;
    }
    
}
